#!/bin/bash
# ==============================
# 脚本功能：安装Jar包到本地maven仓库
# 开发作者：Allen
# 依赖命令：sed | awk | sshspass
# ==============================

# ========== 预定义变量 ========== # 定义一些全局变量或配置

# ========== 脚本预处理 ========== # 处理一些前期行为
shell_file=$(basename $0)
jar_file=$1

# ========== 预定义函数 ========== # 定义一些功能函数
# 打印日志
log () {
    # type: debug info warn error
    local readonly type=$1; local readonly line=$2; local readonly msg=$3
    
    # type 大写处理
    local readonly TYPE=$(echo $type | awk '{print toupper($0)}')
    echo "[$TYPE] $msg <$line>" >&2
    return 0
}
# 创建临时目录
mktemp_dir () {
    local prefix=$1

    local dir=$(mktemp -d /tmp/$prefix.XXXXX)
    echo $dir
    return 0
}
# 获取Maven目录 ()
get_maven_home () {
    local maven_home=$MAVEN_HOME
    if [ ! -d $maven_home ]
    then
        local mvn_path=$(which mvn)
        local maven_bin=$(dirname $mvn_path 2> /dev/null)
        maven_home=$(dirname $mvn_bin 2> /dev/null)
    fi
    if [ ! $maven_home ]
    then
        log error $LINENO "Maven环境异常，请检查环境变量<MAVEN_HOME>是否配置，或者mvn命令是否可用"
        exit 1
    else
        echo $maven_home
    fi
}
# 获取Meven仓库目录
get_maven_repo () {
    local readonly maven_home=$1
    
    local readonly maven_settings="$maven_home/conf/settings.xml"

    if [ ! -f $maven_settings ]
    then
        log error $LINENO "Maven配置文件不存在: $maven_settings"
        exit 2
    fi

    local readonly maven_repo=$(xpath $maven_settings '//settings/localRepository/text()' 2> /dev/null)
    echo $maven_repo
}

# ========== 主程序区 ==========
# mvn 命令检查
hash mvn 2> /dev/null
if [ 0 -ne $? ]; then log error $LINENO "请先配置Maven的环境变量，否则无法使用mvn命令！"; exit 1; fi
# jar 文件检查
if [ ! -n "$jar_file" ]; then log error $LINENO "请在命令后带上JAR包名！"; exit 1; fi
if [ ! -f "$jar_file" ]; then log error $LINENO "JAR包["$jar_file"]不存在！"; exit 1; fi
# 提取后缀并判断
jar_file_suffix=$(echo $jar_file | awk -F "." '{print $NF}')
if [ "jar" != $jar_file_suffix ]; then log error $LINENO "文件["$jar_file"]不是有效的JAR包！"; exit 1; fi
# 临时目录
temp_dir=$(mktemp_dir $shell_file)
# 释放 jar 包
unzip -oq $jar_file -d $temp_dir
log info $LINENO "释放JAR包到临时目录："$temp_dir
# jar 包检查
if [ ! -d "${temp_dir}/META-INF" ]; then log eror $LINENO "文件["$jar_file"]不是有效的JAR包！"; fi
if [ ! -d "${temp_dir}/META-INF/maven" ]; then log error $LINENO "文件["$jar_file"]不是有效的Maven JAR包！"; fi
# jar包信息处理
maven_dir=${temp_dir}/META-INF/maven
dir_1=$(ls -l $maven_dir | grep -E "^d" | awk 'NR==1' | awk '{print $9}')
dir_1=$maven_dir/$dir_1
dir_2=$(ls -l $dir_1 | grep -E "^d" | awk 'NR==1' | awk '{print $9}')
dir_2=$dir_1/$dir_2
pom_prop_file=$dir_2/pom.properties
# 提取JAR包信息
source $pom_prop_file
# Maven install
log info $LINENO "开始安装JAR包..."
log info $LINENO "JAR包信息: version=$version groupId=$groupId artifactId=$artifactId"
mvn install:install-file -Dfile=$jar_file -DgroupId=$groupId -DartifactId=$artifactId -Dversion=$version -Dpackaging=$jar_file_suffix
if [ '0' -ne $? ]; then log error $LINENO "安装失败！"; exit $?; fi
log info $LINENO "安装JAR包完成"
# 删除临时文件夹
rm -rf $temp_dir
# 检查并拷贝源代码文件
jar_file_basename=$(basename $jar_file)
sources_file=${jar_file_basename//.jar/}-sources.jar
if [ -f $sources_file ]
then
    log info $LINENO "发现源代码包: $sources_file"
    log info $LINENO "开始拷贝源代码包..."
    maven_home=$(get_maven_home)
    if [ $? -ne 0 ]; then log info $LINENO "源代码包拷贝失败."; fi
    maven_repo=$(get_maven_repo $maven_home)
    if [ $? -ne 0 ]; then log info $LINENO "源代码包拷贝失败."; fi
    real_path=${maven_repo}/${groupId//./\/}/${artifactId}/${version}
    cp $sources_file $real_path/
    if [ $? -eq 0 ]; then log info $LINENO "源代码包拷贝完成."; else log info $LINENO "源代码包拷贝失败."; fi
fi
